package logica;

import nivel.Casillero;
import personaje.Mario;

/**
 * Clase que modela la logica de los movimientos especificos de mario. Se
 * encarga de reportar si se puede realizar un movimiento o no.
 * 
 * @author Agustin Orge (LU.85538)
 * @author Victoria Martinez de la Cruz (LU.87620)
 */
public class LogicaMario extends Logica {

	/** Atributo que modela si mario esta saltando o no. */
	protected boolean estaSaltando;

	/** Cantidad de saltos realizados. */
	protected int cantSaltos;

	/** Mario */
	protected Mario mario;

	/**
	 * Constructor de la clase
	 * 
	 * @param m
	 *            - mario
	 */
	public LogicaMario(Mario m) {
		mario = m;
		estaSaltando = false;
		cantSaltos = 0;

	}
	/**
	 * Controla si puede moverse a una posicion determinada
	 * @param x - eje x
	 * @param y - eje y
	 * @param e - entidad a mover
	 * @return true, si puede
	 */
	protected boolean puedeSaltar(int x, int y, EntidadConLogica e) {
		Casillero ca = e.getNivel().getTablero().buscarCasillero(x, y);

		if (ca == null) { // no existe el casillero, se puede mover
			return true;
		} else { // existe el casillero, reacciona el obstaculo

			if (ca.getObstaculo() != null) {
				if(ca.hayPowerUp()){
					return ca.getObstaculo().reaccionarPowerUp();
				}else{
				return ca.getObstaculo().reaccionar();
				}
			} else {
				return true;
			}
		}

	}

	/**
	 * Reporta si puede saltar desde la posicion en la que se encuentra.
	 * 
	 * @return true, si puede saltar
	 */
	public boolean saltar(EntidadConLogica e) {

		if (!e.estaCayendo()) {

			boolean arriba, arribaIzq, arribaDer;

			arriba = puedeSaltar(e.getCasilleroActual().getX(), e
					.getCasilleroActual().getY() - 16, e);
			arribaIzq = puedeSaltar(e.getCasilleroActual().getX() - 8, e
					.getCasilleroActual().getY() - 16, e);
			arribaDer = puedeSaltar(e.getCasilleroActual().getX() + 8, e
					.getCasilleroActual().getY() - 16, e);

			return (arribaIzq && arriba && arribaDer);
		} else {

			return false;
		}

	}

	@Override
	public boolean caer(EntidadConLogica e) {
		if (!estaSaltando) {
			return super.caer(e);
		} else {
			return false;
		}
	}

	/**
	 * Retorna la cantidad de saltos realizados.
	 * 
	 * @return cantidad de saltos realizados
	 */
	public boolean cantSaltos() {
		return cantSaltos < 5;
	}

	/**
	 * Reporta si esta saltando o no.
	 * 
	 * @return true, si esta saltando
	 */
	public boolean estaSaltando() {
		return estaSaltando;
	}

	/**
	 * Modifica el valor del atributo estaSaltando
	 * 
	 * @param b
	 *            nuevo valor
	 */
	public void setSaltando(boolean b) {
		estaSaltando = b;
	}

	/**
	 * Aumenta en uno la cantidad de saltos realizados.
	 */
	public void aumentarSaltos() {
		cantSaltos++;
	}

	/**
	 * Vuelve la cantidad de saltos realizados a cero.
	 */
	public void resetearSaltos() {
		cantSaltos = 0;
	}

}
